package com.hsgene.order.service;

import com.hsgene.common.util.result.ApiResult;
import com.hsgene.common.util.result.NullObject;
import com.hsgene.common.util.support.Pagination;
import com.hsgene.order.condition.OrderMallCondition;
import com.hsgene.order.domain.OrderMallItemInvoice;
import com.hsgene.order.domain.OrderMallItemSupplement;
import com.hsgene.order.dto.*;
import com.hsgene.order.dto.details.*;
import com.hsgene.order.dto.list.UserAllMallOrderDto;
import com.hsgene.order.dto.pre.PreOrderDto;

import java.util.Map;

/**
 * 商城订单Service
 *
 * @author wangbing
 * @version 1.0, 2018/8/3
 */
public interface OrderMallService {

    /**
     * 构建预订单
     *
     * @param userId     用户id
     * @param goodsMap   购买商品信息
     * @param clientType 客户端类型
     * @return 预订单信息
     */
    ApiResult<PreOrderDto> buildPreOrder(String userId, Map<String, Integer> goodsMap, String clientType);

    /**
     * 更新预订单信息
     *
     * @param preOrder 预订单信息
     * @return 更新后的预订单信息
     */
    ApiResult<PreOrderDto> updatePreOrder(PreOrderDto preOrder);

    /**
     * 正式提交预订单信息，生成正式订单
     *
     * @param preOrder 预订单信息
     * @return 订单简要信息
     */
    ApiResult<SimpleOrderMallDto> submitPreOrder(PreOrderDto preOrder);

    /**
     * 获取订单支付信息
     *
     * @param orderId 订单编号
     * @param payType 支付方式
     * @return 订单支付信息
     */
    ApiResult<Map<String, Object>> buildOrderPayment(String orderId, String payType);

    /**
     * 支付通知，模拟用户支付成功后，收到异步支付成功通知
     *
     * @param serialNumber 支付流水号
     * @return 结果
     */
    ApiResult<NullObject> payNotice(String serialNumber);

    /**
     * jcl
     * app用户订单列表
     *
     * @param orderMallCondition 查询条件
     * @return 订单信息
     */
    ApiResult<UserAllMallOrderDto> getUserOrders(OrderMallCondition orderMallCondition);

    /**
     * jcl
     * 商城订单列表查询
     *
     * @param orderMallCondition 查询条件
     * @return 订单列表信息
     */
    ApiResult<Pagination<OrderMallItemDto>> getMallOrders(OrderMallCondition orderMallCondition);

    /**
     * 获取订单详情
     *
     * @param itemOrderId  订单id
     * @param customerType 客户端类型
     * @return
     */
    OrderDetailsDto getOrderDetails(String itemOrderId, String customerType);

    /**
     * jcl
     * 查询子订单补充信息
     *
     * @param itemOrderId 子订单号
     * @return 该子订单补充信息
     */
    ApiResult<OrderMallItemSupplementDto> getOrderItemSupplement(String itemOrderId);

    /**
     * jcl
     * 更新子订单补充信息
     *
     * @param orderMallItemSupplement 子订单信息
     * @return
     */
    int updateOrderItemSupplement(OrderMallItemSupplement orderMallItemSupplement, String type);

    /**
     * jcl
     * 更新发货状态
     *
     * @param id                子订单号
     * @param expressageCompany 快递公司
     * @param expressageNo      快递单号
     * @return
     */
    int deliverGoods(String id, String expressageCompany, String expressageNo);

    /**
     * 编辑子订单信息
     *
     * @param editInfoDto 编辑信息
     * @return
     */
    boolean editOrderDetails(OrderDetaulsEditInfoDto editInfoDto);

    /**
     * 订单状态更新
     *
     * @param orderId       订单id
     * @param resultStatus  订单结果状态
     * @param currentStatus 当前状态
     * @return
     */
    boolean orderStatusUpdate(String orderId, String resultStatus, String currentStatus);

    /**
     * jcl
     * 查询订单发票信息
     *
     * @param mainOrderId 总订单id
     * @return 发票信息
     */
    ApiResult<OrderMallItemInvoiceDto> getOrderMallItemInvoice(String mainOrderId);

    /**
     * jcl
     * 添加发票信息
     *
     * @param orderMallInvoice 订单发票信息
     * @return
     */
    int insertOrderItemInvoice(OrderMallItemInvoice orderMallInvoice);

    /**
     * 待支付订单详情
     *
     * @param orderId 订单id
     * @return
     */
    ObligationOrderDetailsInfo getObligationOrderDetailsInfo(String orderId);

    /**
     * 订单回收站
     *
     * @param orderMallCondition 查询条件
     * @return 订单回收站
     */
    ApiResult<Pagination<OrderMallDto>> orderRecycle(OrderMallCondition orderMallCondition);

}
